// TypeScript的基本数据类型
var a = 'zs';
var b = 12;
var c = false;
var d = 'ls'; //完全禁用类型检查，允许对变量进行任意操作而不会引发类型错误
var e = 'sv'; //会保留类型检查，修改变量自身的值‌时无需额外检查,使用该变量时‌强制要求类型确认
var f = null;
var g = undefined;
// void、never
function fun1() {
    console.log('23');
    // void是没有返回值
}
function fun2() {
    console.log('23');
    throw new Error('出错了');
    // 函数不会执行，直接抛出错误
}
console.log("any和unknown数据类型区别演示1:");
// any和unknown数据类型区别演示
d = 26.546;
console.log("d:any = 'ls'赋值", d.toFixed(2));
e = 15.42;
// let e1 = e.toFixed(2)  //❌ 编译报错：Property 'toFixed' does not exist on type 'unknown'.
if (typeof e === 'number') {
    console.log(e.toFixed(2));
} //可以用类型缩小（通过判断断言进行处理）
/* any和unknown数据类型具体区别演示 */
// (1)赋值规则对比
// any类型：可赋值给任意类型变量（关闭类型检查）
var anyVar = 'hello';
var num1 = anyVar; // ✅ 编译通过（不安全，实际值为string）
var str1 = anyVar; // ✅ 编译通过
// unknown类型：仅可赋值给unknown或any类型（类型安全）
var unknownVar = 'world';
// let num2: number = unknownVar  // ❌ 编译报错：Type 'unknown' is not assignable to type 'number'
// let str2: string = unknownVar  // ❌ 编译报错：Type 'unknown' is not assignable to type 'string'
var unknownVar2 = unknownVar; // ✅ 编译通过（仅允许赋值给unknown）
var anyVar2 = unknownVar; // ✅ 编译通过（仅允许赋值给any）
// (2)操作限制对比
// any类型：可直接执行任意操作（无类型检查，运行时可能报错）
var anyData = 'typescript';
console.log(anyData.toUpperCase()); // ✅ 运行正常（string有toUpperCase方法）
// console.log(anyData.foo())  // ✅ 编译通过，但运行时报错：anyData.foo is not a function
console.log(anyData.bar); // ✅ 编译通过，运行时输出undefined（属性不存在）
// unknown类型：必须先确认类型才能操作（编译时强制类型安全）
var unknownData = 'typescript';
// console.log(unknownData.toUpperCase())  // ❌ 编译报错：Object is of type 'unknown'
// 方案1：类型断言（告诉TS变量的具体类型）
console.log(unknownData.toUpperCase()); // ✅ 编译通过，运行正常
// 方案2：类型检查（通过typeof/instanceof细化类型）
if (typeof unknownData === 'string') {
    console.log(unknownData.toUpperCase()); // ✅ 编译通过，运行正常
}
